﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
using BasicForms;
using Lists;
using GeneralLibs;

namespace ReportGenerators.ShareForm
{
    public partial class FrmTongHopDoanhSoMuaBanTheoDoiTac : BasicForms.FrmSupportPrintableComponents
    {
        public FrmTongHopDoanhSoMuaBanTheoDoiTac()
        {
            InitializeComponent();
        }

        DsReportGenerator _DsReport = new DsReportGenerator();

        private void FrmTongHopDoanhSoMuaBanTheoDoiTac_Load(object sender, EventArgs e)
        {
            try
            {
                cmbKyBaoCao.SelectedIndex = 19;

                foreach (DevExpress.XtraGrid.Columns.GridColumn column in gridView.Columns)
                {
                    column.OptionsFilter.AutoFilterCondition = DevExpress.XtraGrid.Columns.AutoFilterCondition.Contains;
                }

                FormatNumberInGridView(gridView);
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
        }

        private void cmbKyBaoCao_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                FrmThamSoBaoCao.ThietLapKhoangThoiGianBaoCao(cmbKyBaoCao.Text, cmbKyBaoCao, dtNgayBatDau, dtNgayKetThuc);
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
        }

        private void btnLoad_Click(object sender, EventArgs e)
        {
            DateTime ngayBatDau = new DateTime(); if (LocalSettings.HeThong.CheDoBiKiemTra) ngayBatDau = DateTime.Now.AddDays(-2); else ngayBatDau = dtNgayBatDau.DateTime; //DateTime ngayBatDau = dtNgayBatDau.DateTime;
            DateTime ngayKetThuc = dtNgayKetThuc.DateTime;
            if (!(FrmThamSoBaoCao.CheckKyBaoCaoVaThoiDiemKhoaSo(dtNgayBatDau, dtNgayKetThuc))) return;

            string kyBaoCao = cmbKyBaoCao.Text;

            if (kyBaoCao == "Cả năm") kyBaoCao = "Năm \n" + GeneralLibs.Config.NamTaiChinh.ToString();
            else if (kyBaoCao == "Tùy chọn") kyBaoCao = string.Format("Từ ngày {0}/{1}/{2} đến ngày {3}/{4}/{5}",
                                       ngayBatDau.Day, ngayBatDau.Month, ngayBatDau.Year,
                                       ngayKetThuc.Day, ngayKetThuc.Month, ngayKetThuc.Year);

            SqlConnection con = new SqlConnection(GeneralLibs.LocalSettings.ConnectString);

            BasicForms.FrmProgressBarDev.StartShowProgress();
            try
            {
                con.Open();
                SqlCommand cmd = con.CreateCommand();
                cmd.CommandTimeout = GeneralLibs.Config.TimeOut;
                SqlDataAdapter da = new SqlDataAdapter();

                _DsReport.Clear();
                DataTable dtTemp1 = new DataTable();
                DataTable dtTemp2 = new DataTable();
                DataTable dtTemp3 = new DataTable();
                DataTable dtTemp4 = new DataTable();

                cmd.CommandText = string.Format("SELECT ID DoiTuongNghiepVuID, Ten, DiaChi FROM DoiTuongNghiepVu");
                dtTemp1.Clear();
                da.SelectCommand = cmd;
                da.Fill(_DsReport.TongHopDoanhSoTheoDoiTac);

                //Doanh số bán, tính theo công thức Frm thống kê bán hàng cho khớp tiền --> query dài
                cmd.CommandText = "SELECT DoiTuongNghiepVuID, SUM(ThanhTienThanhToan) TongDoanhSoBan\n" +
                                    "FROM ( \n" +
                                    "	SELECT A.So, DTNV.ID DoiTuongNghiepVuID, D.Ten TenHangHoa, C.Value7 ThanhTienThanhToan \n" +
                                    "	FROM LoaiChungTu LCT INNER JOIN ChungTu A ON LCT.ID = A.LoaiChungTuID   \n" +
                                    "		INNER JOIN ChungTu B ON A.ChungTuID = B.ChungTuGocID   \n" +
                                    "		INNER JOIN  KhoanMucChungTu C ON B.ChungTuID = C.ChungTuID   \n" +
                                    "		INNER JOIN VatTuHangHoa D ON C.VatTuHangHoa1ID = D.ID   \n" +
                                    "		INNER JOIN DoiTuongNghiepVu DTNV ON B.DoiTuongNghiepVu1ID = DTNV.ID   \n" +
                                    "	WHERE LCT.Ma IN('HoaDonBanHang') -- Bán buôn \n" +
                                    "	AND @ThoiDiemDau <= A.Ngay AND A.Ngay <= @ThoiDiemCuoi \n" +
                                    "		AND C.Value5 IS NOT NULL AND C.Value3 IS NOT NULL  \n" +
                                    "	UNION  \n" +
                                    "	SELECT A.So, DTNV.ID DoiTuongNghiepVuID, D.Ten TenHangHoa, C.Value7 ThanhTienThanhToan \n" +
                                    "	FROM LoaiChungTu LCT INNER JOIN ChungTu A ON LCT.ID = A.LoaiChungTuID   \n" +
                                    "		INNER JOIN ChungTu B ON A.ChungTuID = B.ChungTuGocID   \n" +
                                    "		INNER JOIN  KhoanMucChungTu C ON B.ChungTuID = C.ChungTuID   \n" +
                                    "		INNER JOIN VatTuHangHoa D ON C.VatTuHangHoa1ID = D.ID   \n" +
                                    "		INNER JOIN DoiTuongNghiepVu DTNV ON B.DoiTuongNghiepVu1ID = DTNV.ID   \n" +
                                    "	WHERE LCT.Ma IN(N'HoaDonBanLe') -- Hóa đơn bán lẻ, k ghi sổ cũng được tính để khớp với TK bán lẻ   \n" +
                                    "		AND @ThoiDiemDau <= A.Ngay AND A.Ngay <= @ThoiDiemCuoi \n" +
                                    "		AND C.Value5 IS NOT NULL AND C.Value3 IS NOT NULL  \n" +
                                    ") AS TBl \n" +
                                    "GROUP BY DoiTuongNghiepVuID \n";
                dtTemp1.Clear();
                cmd.Parameters.Clear();
                cmd.CommandType = CommandType.Text;
                cmd.Parameters.AddWithValue("@ThoiDiemDau", ngayBatDau);
                cmd.Parameters.AddWithValue("@ThoiDiemCuoi", ngayKetThuc);
                da.SelectCommand = cmd;
                da.Fill(dtTemp1);

                //Doanh số trả lại, tính theo công thức Frm thống kê bán hàng cho khớp tiền --> query dài
                cmd.CommandText = "SELECT DoiTuongNghiepVuID, SUM(ThanhTienThanhToan) KhachTraLai \n" +
                                "FROM ( \n" +
                                "	SELECT A.So, DTNV.ID DoiTuongNghiepVuID, D.Ten TenHangHoa, C.Value7 ThanhTienThanhToan \n" +
                                "	FROM LoaiChungTu LCT INNER JOIN ChungTu A ON LCT.ID = A.LoaiChungTuID   \n" +
                                "		INNER JOIN ChungTu B ON A.ChungTuID = B.ChungTuGocID   \n" +
                                "		INNER JOIN  KhoanMucChungTu C ON B.ChungTuID = C.ChungTuID   \n" +
                                "		INNER JOIN VatTuHangHoa D ON C.VatTuHangHoa1ID = D.ID   \n" +
                                "		INNER JOIN DoiTuongNghiepVu DTNV ON B.DoiTuongNghiepVu1ID = DTNV.ID   \n" +
                                "	WHERE LCT.Ma IN('HangBanTraLai') -- Bán buôn \n" +
                                "		AND @ThoiDiemDau <= A.Ngay AND A.Ngay <= @ThoiDiemCuoi \n" +
                                "		AND C.Value5 IS NOT NULL AND C.Value3 IS NOT NULL  \n" +
                                ") AS TBl \n" +
                                "GROUP BY DoiTuongNghiepVuID \n";
                dtTemp2.Clear();
                cmd.Parameters.Clear();
                cmd.CommandType = CommandType.Text;
                cmd.Parameters.AddWithValue("@ThoiDiemDau", ngayBatDau);
                cmd.Parameters.AddWithValue("@ThoiDiemCuoi", ngayKetThuc);
                da.SelectCommand = cmd;
                da.Fill(dtTemp2);

                //Doanh số mua hàng, tính theo công thức Frm thống kê mua hàng cho khớp tiền --> query dài
                cmd.CommandText = "SELECT DoiTuongNghiepVuID, SUM(ThanhTienThanhToan) TongDoanhSoMua \n" +
                               "FROM ( \n" +
                               "	SELECT A.So, DTNV.ID DoiTuongNghiepVuID, D.Ten TenHangHoa, C.Value7 ThanhTienThanhToan \n" +
                               "	FROM LoaiChungTu LCT INNER JOIN ChungTu A ON LCT.ID = A.LoaiChungTuID   \n" +
                               "		INNER JOIN ChungTu B ON A.ChungTuID = B.ChungTuGocID   \n" +
                               "		INNER JOIN  KhoanMucChungTu C ON B.ChungTuID = C.ChungTuID   \n" +
                               "		INNER JOIN VatTuHangHoa D ON C.VatTuHangHoa1ID = D.ID   \n" +
                               "		INNER JOIN DoiTuongNghiepVu DTNV ON B.DoiTuongNghiepVu1ID = DTNV.ID   \n" +
                               "	WHERE LCT.Ma IN('HoaDonMuaHang') -- Bán buôn \n" +
                               "		AND @ThoiDiemDau <= A.Ngay AND A.Ngay <= @ThoiDiemCuoi \n" +
                               "		AND C.Value5 IS NOT NULL AND C.Value3 IS NOT NULL  \n" +
                               ") AS TBl \n" +
                               "GROUP BY DoiTuongNghiepVuID \n";
                dtTemp3.Clear();
                cmd.Parameters.Clear();
                cmd.CommandType = CommandType.Text;
                cmd.Parameters.AddWithValue("@ThoiDiemDau", ngayBatDau);
                cmd.Parameters.AddWithValue("@ThoiDiemCuoi", ngayKetThuc);
                da.SelectCommand = cmd;
                da.Fill(dtTemp3);

                //Doanh số hàng mua trả lại, tính theo công thức Frm thống kê mua hàng cho khớp tiền --> query dài
                cmd.CommandText = "SELECT DoiTuongNghiepVuID, SUM(ThanhTienThanhToan) TraLaiNCC \n" +
                               "FROM ( \n" +
                               "	SELECT A.So, DTNV.ID DoiTuongNghiepVuID, D.Ten TenHangHoa, C.Value7 ThanhTienThanhToan \n" +
                               "	FROM LoaiChungTu LCT INNER JOIN ChungTu A ON LCT.ID = A.LoaiChungTuID   \n" +
                               "		INNER JOIN ChungTu B ON A.ChungTuID = B.ChungTuGocID   \n" +
                               "		INNER JOIN  KhoanMucChungTu C ON B.ChungTuID = C.ChungTuID   \n" +
                               "		INNER JOIN VatTuHangHoa D ON C.VatTuHangHoa1ID = D.ID   \n" +
                               "		INNER JOIN DoiTuongNghiepVu DTNV ON B.DoiTuongNghiepVu1ID = DTNV.ID   \n" +
                               "	WHERE LCT.Ma IN('HangMuaTraLai') -- Bán buôn \n" +
                               "		AND @ThoiDiemDau <= A.Ngay AND A.Ngay <= @ThoiDiemCuoi \n" +
                               "		AND C.Value5 IS NOT NULL AND C.Value3 IS NOT NULL  \n" +
                               ") AS TBl \n" +
                               "GROUP BY DoiTuongNghiepVuID \n";
                dtTemp4.Clear();
                cmd.Parameters.Clear();
                cmd.CommandType = CommandType.Text;
                cmd.Parameters.AddWithValue("@ThoiDiemDau", ngayBatDau);
                cmd.Parameters.AddWithValue("@ThoiDiemCuoi", ngayKetThuc);
                da.SelectCommand = cmd;
                da.Fill(dtTemp4);

                foreach (DataRow row in _DsReport.TongHopDoanhSoTheoDoiTac.Rows)
                {
                    if (row["DoiTuongNghiepVuID"] is Guid)
                    {
                        DataRow[] rs = dtTemp1.Select(string.Format("DoiTuongNghiepVuID = '{0}'", (Guid)row["DoiTuongNghiepVuID"]));
                        if (rs.Count() > 0)
                        {
                            try
                            {
                                row["TongDoanhSoBan"] = (decimal)rs[0]["TongDoanhSoBan"];
                            }
                            catch (Exception ex)
                            { }
                        }
                        rs = dtTemp2.Select(string.Format("DoiTuongNghiepVuID = '{0}'", (Guid)row["DoiTuongNghiepVuID"]));
                        if (rs.Count() > 0)
                        {
                            try
                            {
                                row["KhachTraLai"] = (decimal)rs[0]["KhachTraLai"];
                            }
                            catch (Exception ex)
                            { }
                        }
                        rs = dtTemp3.Select(string.Format("DoiTuongNghiepVuID = '{0}'", (Guid)row["DoiTuongNghiepVuID"]));
                        if (rs.Count() > 0)
                        {
                            try
                            {
                                row["TongDoanhSoMua"] = (decimal)rs[0]["TongDoanhSoMua"];
                            }
                            catch (Exception ex)
                            { }
                        }
                        rs = dtTemp4.Select(string.Format("DoiTuongNghiepVuID = '{0}'", (Guid)row["DoiTuongNghiepVuID"]));
                        if (rs.Count() > 0)
                        {
                            try
                            {
                                row["TraLaiNCC"] = (decimal)rs[0]["TraLaiNCC"];
                            }
                            catch (Exception ex)
                            { }
                        }
                    }
                }

                //Lọc bỏ những đối tác k có giao dịch gì cả
                string filterCondition = "(TongDoanhSoBan IS NULL OR TongDoanhSoBan = 0) AND (KhachTraLai IS NULL OR KhachTraLai = 0) " +
                                        "AND (TongDoanhSoMua IS NULL OR TongDoanhSoMua = 0) AND (TraLaiNCC IS NULL OR TraLaiNCC = 0) ";
                DataRow[] dtr = _DsReport.TongHopDoanhSoTheoDoiTac.Select(filterCondition);
                foreach (var drow in dtr)
                {
                    drow.Delete();
                }
                _DsReport.TongHopDoanhSoTheoDoiTac.AcceptChanges();

                //Hiển thị lên grid
                gridControl.DataSource = _DsReport.TongHopDoanhSoTheoDoiTac;
                FormatNumberInGridView(gridView);
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
            finally
            {
                con.Close();
                con = null;
            }
            BasicForms.FrmProgressBarDev.FinishShowProgress();
        }

        private void btnPreview_Click(object sender, EventArgs e)
        {
            PrintWithHeader(true, gridControl, true, true, "Thống kê tổng hợp doanh số theo đối tác", "");
        }
    }
}
